package ar.org.sstuyv

import grails.converters.JSON

import java.text.DateFormat

import org.springframework.dao.DataIntegrityViolationException

class PersonaController {

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

    def index() {
        redirect(action: "list", params: params)
    }

    def list(Integer max) {
        params.max = Math.min(max ?: 10, 100)
        [personaInstanceList: Persona.list(params), personaInstanceTotal: Persona.count()]
    }

    def create() {
        [personaInstance: new Persona(params)]
    }

//    def save() {
//        def personaInstance = new Persona(params)
//        if (!personaInstance.save(flush: true)) {
//            render(view: "create", model: [personaInstance: personaInstance])
//            return
//        }
//
//        flash.message = message(code: 'default.created.message', args: [message(code: 'persona.label', default: 'Persona'), personaInstance.id])
//        redirect(action: "show", id: personaInstance.id)
//    }
	
	
	def save = {		
		
		Date fecha
		
		DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
		
		def idBeneficio	= params.beneficioSeleccionado
		Bien bien = Bien.findById(params.bienSeleccionado)
		def persona = new Persona()
		def apellido = params.apellido
		def nombre = params.nombres
		def dni = params.documento
		TipoDocumento tipoDoc = TipoDocumento.findById(dni)
		def nroDni = params.numeroDocumento
		def domicilio = params.domicilio
		Date fechaNacimiento =  df.parse(params.fechaNacimiento)
		def nacionalidad = params.nacionalidad
		def madre = params.madre
		def padre = params.padre
		def ocupacion = params.ocupacion
		Ocupacion tipoOcupacion = Ocupacion.findById(ocupacion)
		def relacionCivil = params.relacionCivil
		def estadoCivil = params.estadoCivil
		EstadoCivil tipoEstadoCivil = EstadoCivil.findById(estadoCivil)
		persona.setApellido(apellido)
		persona.setNombres(nombre)
		persona.setDocumento(tipoDoc)
		persona.setNumeroDocumento(nroDni)
		persona.setDomicilio(domicilio)
		persona.setFechaNacimiento(fechaNacimiento)
		persona.setNacionalidad(nacionalidad)
		persona.setMadre(madre)
		persona.setPadre(padre)
		persona.setOcupacion(tipoOcupacion)
		persona.setRelacionCivil(relacionCivil)
		persona.setEstadoCivil(tipoEstadoCivil)
		persona.setBien(bien)
		
		persona.save(failOnError:true)
		
		flush: true
		
		render ""
		
	}

    def show(Long id) {
        def personaInstance = Persona.get(id)
        if (!personaInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'persona.label', default: 'Persona'), id])
            redirect(action: "list")
            return
        }

        [personaInstance: personaInstance]
    }

    def edit(Long id) {
        def personaInstance = Persona.get(id)
        if (!personaInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'persona.label', default: 'Persona'), id])
            redirect(action: "list")
            return
        }

        [personaInstance: personaInstance]
    }

//    def update(Long id, Long version) {
//        def personaInstance = Persona.get(id)
//        if (!personaInstance) {
//            flash.message = message(code: 'default.not.found.message', args: [message(code: 'persona.label', default: 'Persona'), id])
//            redirect(action: "list")
//            return
//        }
//
//        if (version != null) {
//            if (personaInstance.version > version) {
//                personaInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
//                          [message(code: 'persona.label', default: 'Persona')] as Object[],
//                          "Another user has updated this Persona while you were editing")
//                render(view: "edit", model: [personaInstance: personaInstance])
//                return
//            }
//        }
//
//        personaInstance.properties = params
//
//        if (!personaInstance.save(flush: true)) {
//            render(view: "edit", model: [personaInstance: personaInstance])
//            return
//        }
//
//        flash.message = message(code: 'default.updated.message', args: [message(code: 'persona.label', default: 'Persona'), personaInstance.id])
//        redirect(action: "show", id: personaInstance.id)
//    }

//    def delete(Long id) {
//        def personaInstance = Persona.get(id)
//        if (!personaInstance) {
//            flash.message = message(code: 'default.not.found.message', args: [message(code: 'persona.label', default: 'Persona'), id])
//            redirect(action: "list")
//            return
//        }
//
//        try {
//            personaInstance.delete(flush: true)
//            flash.message = message(code: 'default.deleted.message', args: [message(code: 'persona.label', default: 'Persona'), id])
//            redirect(action: "list")
//        }
//        catch (DataIntegrityViolationException e) {
//            flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'persona.label', default: 'Persona'), id])
//            redirect(action: "show", id: id)
//        }
//    }
	
	
	def delete(Long id) {
		def personaInstance = Persona.get(id)
		if (!personaInstance) {
			flash.message = message(code: 'default.not.found.message', args: [message(code: 'persona.label', default: 'Persona'), id])
			redirect(action: "list")
			return
		}

		try {
			personaInstance.delete(flush: true)
			flash.message = message(code: 'default.deleted.message', args: [message(code: 'persona.label', default: 'Persona'), id])
			redirect(action: "list")
		}
		catch (DataIntegrityViolationException e) {
			flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'persona.label', default: 'Persona'), id])
			redirect(action: "show", id: id)
		}
	}
	
	
		
	def update = {
		
		
		Date fecha
		
		DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
		
		
		Persona persona = Persona.findById(params.id)
		def apellido = params.apellido
		def nombre = params.nombres
		def dni = params.documento
		TipoDocumento tipoDoc = TipoDocumento.findById(dni)
		def nroDni = params.numeroDocumento
		def domicilio = params.domicilio
		Date fechaNacimiento =  df.parse(params.fechaNacimiento)		
		def nacionalidad = params.nacionalidad
		def madre = params.madre
		def padre = params.padre
		def ocupacion = params.ocupacion
		Ocupacion tipoOcupacion = Ocupacion.findById(ocupacion)
		def relacionCivil = params.relacionCivil
		def estadoCivil = params.estadoCivil
		EstadoCivil tipoEstadoCivil = EstadoCivil.findById(estadoCivil)
		persona.setApellido(apellido)
		persona.setNombres(nombre)
		persona.setDocumento(tipoDoc)
		persona.setNumeroDocumento(nroDni)
		persona.setDomicilio(domicilio)
		persona.setFechaNacimiento(fechaNacimiento)
		persona.setNacionalidad(nacionalidad)
		persona.setMadre(madre)
		persona.setPadre(padre)
		persona.setOcupacion(tipoOcupacion)
		persona.setRelacionCivil(relacionCivil)
		persona.setEstadoCivil(tipoEstadoCivil)
		
		persona.save(failOnError:true)
		
		flush: true
		
		render ""
	}
	
	def listJson = {
		
		def sortIndex = params.sidx ?: 'apelldio'
		def sortOrder  = params.sord ?: 'asc'
		def maxRows = Integer.valueOf(params.rows)
		def currentPage = Integer.valueOf(params.page) ?: 1
		def rowOffset = currentPage == 1 ? 0 : (currentPage - 1) * maxRows
		
		def persona = Persona.createCriteria().list(max: maxRows, offset: rowOffset) {
			if (params.id) eq('id', params.id.toLong())
			order(sortIndex, sortOrder)
		}
		
		def totalRows = persona.totalCount
		def numberOfPages = Math.ceil(totalRows / maxRows)
		
		def results = persona?.collect {
			[
				 cell: [it.apellido, it.nombres, it.documento?.nombre, it.numeroDocumento, it.domicilio, it.fechaNacimiento, it.nacionalidad,
					 it.madre, it.padre, it.ocupacion?.descripcion, it.relacionCivil, it.estadoCivil?.descripcion],
				 id: it.id
			]
		}

		
		def jsonData = [rows: results, page: currentPage, records: totalRows, total: numberOfPages ]
		render jsonData as JSON
	
	}
	
//	def buscar = {
//	
////	def persona = Persona.findAllByBeneficio(Beneficio.findById(params.id).id)
//	
//	def beneficio = Beneficio.findById(params.id)
//		
//	def persona = Persona.findAllByBeneficio(beneficio)
//		
//	def results = persona?.collect {
//		[
//			cell: [it.apellido, it.nombres, it.documento?.nombre, it.numeroDocumento, it.domicilio, it.fechaNacimiento, it.nacionalidad,
//					 it.madre, it.padre, it.ocupacion?.descripcion, it.relacionCivil, it.estadoCivil?.descripcion],
//			id: it.id
//		]
//	}
//
//	def jsonData = [rows: results]
//
//	render jsonData as JSON
//	}
	
	
	
	def buscar = {
		
		def maxRows = Integer.valueOf(params.rows)
		def currentPage = Integer.valueOf(params.page) ?: 1
		def rowOffset = currentPage == 1 ? 0 : (currentPage - 1) * maxRows
		
		def idBien = params.id
		
		Bien bien = Bien.findById(idBien)
		def persona = Persona.createCriteria().list(max: maxRows, offset: rowOffset) {
			eq("bien", bien)
		}
				
		def totalRows = persona.totalCount
		def numberOfPages = Math.ceil(totalRows / maxRows)
						
		def results = persona?.collect {
		[
			cell: [it.apellido, it.nombres, it.documento?.nombre, it.numeroDocumento, it.domicilio, it.fechaNacimiento, it.nacionalidad,
					 it.madre, it.padre, it.ocupacion?.descripcion, it.relacionCivil, it.estadoCivil?.descripcion],
			id: it.id
		]
		}
			
		
		def jsonData = [rows: results, page: currentPage, records: totalRows, total: numberOfPages]
	
		render jsonData as JSON
	}
	
	
	
	def limpiarGrilla = {
		def jsonData = [rows: ['']]
		render jsonData as JSON
	}
}
